#ifndef MODBUSHELPER_H
#define MODBUSHELPER_H

#include <QVector>
#include <QString>
#include <cstdint>

/**
 * @brief Modbus 数据解析工具类
 * @details 提供 Modbus TCP 寄存器数据的解析功能：
 *          - 将 2 个 16 位寄存器转换为 FLOAT32（IEEE 754）
 *          - 使用大端字节序（Modbus TCP 标准）
 *          - 数据验证和错误处理
 */
class ModbusHelper
{
public:
    // 寄存器地址定义（根据开发文档）
    static constexpr int REGISTER_TEMPERATURE = 0; // 温度寄存器起始地址
    static constexpr int REGISTER_PRESSURE = 2;    // 压力寄存器起始地址
    static constexpr int REGISTER_FLOW = 4;        // 流量寄存器起始地址

    /**
     * @brief 将 2 个 16 位寄存器转换为 FLOAT32（大端字节序）
     * @param registers 寄存器数组（至少包含 2 个元素）
     * @param startIndex 起始索引
     * @return 浮点数值
     */
    static float registersToFloat(const QVector<quint16> &registers, int startIndex = 0);

    /**
     * @brief 将 FLOAT32 转换为 2 个 16 位寄存器（大端字节序）
     * @param value 浮点数值
     * @return 寄存器数组（2 个元素）
     */
    static QVector<quint16> floatToRegisters(float value);

    /**
     * @brief 解析温度数据
     * @param registers 寄存器数组
     * @param startIndex 起始索引（默认 0）
     * @return 温度值（℃）
     */
    static float parseTemperature(const QVector<quint16> &registers, int startIndex = 0);

    /**
     * @brief 解析压力数据
     * @param registers 寄存器数组
     * @param startIndex 起始索引（默认 2）
     * @return 压力值（kPa）
     */
    static float parsePressure(const QVector<quint16> &registers, int startIndex = 2);

    /**
     * @brief 解析流量数据
     * @param registers 寄存器数组
     * @param startIndex 起始索引（默认 4）
     * @return 流量值（L/min）
     */
    static float parseFlow(const QVector<quint16> &registers, int startIndex = 4);

    /**
     * @brief 验证寄存器数据是否有效
     * @param registers 寄存器数组
     * @param requiredCount 需要的寄存器数量
     * @return 是否有效
     */
    static bool validateRegisters(const QVector<quint16> &registers, int requiredCount);

    /**
     * @brief 检查浮点数是否有效（非 NaN、非 Inf）
     * @param value 浮点数值
     * @return 是否有效
     */
    static bool isValidFloat(float value);

    /**
     * @brief 将寄存器数据转换为十六进制字符串（用于调试）
     * @param registers 寄存器数组
     * @return 十六进制字符串
     */
    static QString registersToHexString(const QVector<quint16> &registers);

private:
    ModbusHelper() = delete; // 禁止实例化
};

#endif // MODBUSHELPER_H
